package sui.utils.result;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.helpers.MessageFormatter;

import com.alibaba.fastjson.JSON;

/**
 * <p>
 * Description: 返回值工厂类
 * </p>
 * @author 	XQF SUI
 * @Created 2016年11月18日 下午11:30:53
 * @version 1.0
 */
public class ResultFactory {
	
	public static final String RESULT_KEY = "result_code";
	public static final String RESULT_MES = "result_message";

	/**
	 * <p>
	 * Description: 创建Map
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:20:42
	 * @return
	 */
	public static Map<String, Object> createMap() {
		return new HashMap<String, Object>();
	}
	
	/**
	 * <p>
	 * Description: 创建Map
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:20:55
	 * @param key 	key
	 * @param o		value
	 * @return

	 */
	public static Map<String, Object> createMap(String key, Object o) {
		Map<String, Object> map = createMap();
		map.put(key, o);
		
		return map;
	}
	
	/**
	 * <p>
	 * Description: 创建返回Map
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:21:21
	 * @param resultEnum	结果枚举类
	 * @return
	 */
	public static Map<String, Object> createResultMap(ResultEnum resultEnum) {
		return initParam(createMap(), resultEnum.key, resultEnum.msg);
	}
	
	/**
	 * <p>
	 * Description: 创建返回Map
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:21:56
	 * @param resultEnum		结果枚举类
	 * @param customizedMessage	自定义消息
	 * @return
	 */
	public static Map<String, Object> createResultMap(ResultEnum resultEnum, String customizedMessage) {
		return initParam(createMap(), resultEnum.key, customizedMessage);
	}
	
	/**
	 * <p>
	 * Description: 创建返回Map
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:23:23
	 * @param resultEnum		结果枚举类
	 * @param customizedMessage	自定义消息
	 * @param o					消息参数
	 * @return
	 */
	public static Map<String, Object> createResultMap(ResultEnum resultEnum, String customizedMessage, Object... o) {
		return initParam(createMap(), resultEnum.key, initMessage(customizedMessage, o));
	}
	
	/**
	 * <p>
	 * Description: 创建返回Map
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:28:17
	 * @param customizedCode	自定义CODE
	 * @param customizedMessage	自定义消息
	 * @param paramMap			返回参数Map
	 * @return
	 */
	public static Map<String, Object> createResultMap(String customizedCode, String customizedMessage, Map<String, Object> paramMap) {
		return initParam(paramMap, customizedCode, customizedMessage);
	}
	
	/**
	 * <p>
	 * Description: 创建返回Map
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:29:07
	 * @param resultEnum	结果枚举类
	 * @param paramMap		返回参数Map
	 * @return
	 */
	public static Map<String, Object> createResultMap(ResultEnum resultEnum, Map<String, Object> paramMap) {
		return initParam(paramMap, resultEnum.key, resultEnum.msg);
	}
	
	/**
	 * <p>
	 * Description: 创建返回JSON
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:30:43
	 * @param customizedCode	自定义CODE
	 * @param o					返回消息
	 * @return
	 */
	public static String createResultJSONString(String customizedCode, Object o) {
		return JSON.toJSONString(createMap(customizedCode, o));
	}
	
	/**
	 * <p>
	 * Description: 创建返回JSON
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:34:06
	 * @param resultEnum	结果枚举类
	 * @return
	 */
	public static String createResultJSONString(ResultEnum resultEnum) {
		return JSON.toJSONString(createResultMap(resultEnum));
	}
	
	/**
	 * <p>
	 * Description: 创建返回JSON
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:35:53
	 * @param resultEnum		结果枚举类
	 * @param customizedMessage	自定义消息
	 * @return
	 */
	public static String createResultJSONString(ResultEnum resultEnum, String customizedMessage) {
		return JSON.toJSONString(createResultMap(resultEnum, customizedMessage));
	}
	
	/**
	 * <p>
	 * Description: 创建返回JSON
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:36:19
	 * @param resultEnum		结果枚举类
	 * @param customizedMessage	自定义消息
	 * @param o					消息参数
	 * @return
	 */
	public static String createResultJSONString(ResultEnum resultEnum, String customizedMessage, Object... o) {
		return JSON.toJSONString(createResultMap(resultEnum, initMessage(customizedMessage, o)));
	}
	
	/**
	 * <p>
	 * Description: 创建返回JSON
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:38:01
	 * @param resultEnum	结果枚举类
	 * @param paramMap		返回参数Map
	 * @return
	 */
	public static String createResultJSONString(ResultEnum resultEnum, Map<String, Object> paramMap) {
		return JSON.toJSONString(createResultMap(resultEnum, paramMap));
	}
	
	/**
	 * <p>
	 * Description: 创建返回JSON
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:39:13
	 * @param customizedCode	自定义CODE
	 * @param customizedMessage	自定义消息
	 * @param paramMap			返回参数Map
	 * @return
	 */
	public static String createResultJSONString(String customizedCode, String customizedMessage, Map<String, Object> paramMap) {
		return JSON.toJSONString(createResultMap(customizedCode, customizedMessage, paramMap));
	}
	
	/**
	 * <p>
	 * Description: 初始化消息
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:40:18
	 * @param message	消息
	 * @param o			消息参数
	 * @return
	 */
	public static String initMessage(String message, Object... o) {
		return MessageFormatter.arrayFormat(message, o).getMessage();
	}
	
	/**
	 * <p>
	 * Description: 初始化参数
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:41:40
	 * @param paramMap
	 * @param code
	 * @param message
	 * @return
	 */
	public static Map<String, Object> initParam(Map<String, Object> paramMap, String code, String message) {
		paramMap.put(RESULT_KEY, code);
		paramMap.put(RESULT_MES, message);
		
		return paramMap;
	}
	
	/**
	 * <p>
	 * Description: 结果枚举类(可根据需求考虑单独出去)
	 * </p>
	 * @author 	XQF SUI
	 * @Created 2016年11月19日 下午3:42:09
	 * @version 1.0
	 */
	public enum ResultEnum {
		
		/**
		 * 成功(A10001)
		 */
		COMMON_SUCCESS("A10001", "成功"),
		
		/**
		 * 失败(A10002)
		 */
		COMMON_FAIL("A10002", "失败"),
		
		/**
		 * 已存在(A10003)
		 */
		COMMON_EXISTS("A10003", "已存在"),
		
		/**
		 * 不存在(A10004)
		 */
		COMMON_NON_EXISTS("A10004", "不存在");
		
		private String key;
		private String msg;
		
		ResultEnum(String key, String msg) {
			this.key = key;
			this.msg = msg;
		}
	}
	
	/**
	 * <p>
	 * Description: 测试Main方法
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月19日 下午3:46:49
	 * @param args
	 */
	public static void main(String[] args) {
		Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("date", "test");
		
		System.out.println(ResultFactory.createResultJSONString(ResultEnum.COMMON_FAIL, "昵称为:[ {} ]", "张三"));
	}
}
